home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / programm / gemfsc20 / gemfsc20.lzh / GEMFUNCS / GRFUDSLI.C < prev    next >
C/C++ Source or Header  |  1993-03-20  |  2KB  |  79 lines

  1. /**************************************************************************
  2.  * GRFUDSLI.C - A graf_slidebox, with callback to user update function.
  3.  *************************************************************************/
  4.  
  5. #include "gemfintl.h"
  6.  
  7. /*-------------------------------------------------------------------------
  8.  *
  9.  *-----------------------------------------------------------------------*/
  10.  
  11. short grf_udslidebox(ptree, obj, vertical, ufunc, udata)
  12.     OBJECT            *ptree;
  13.     short            obj;
  14.     short            vertical;
  15.     GUDSLIDE_FUNC    *ufunc;
  16.     void            *udata;
  17. {
  18.     short    slidepos;
  19.     short    dmy;
  20.     short    mx;
  21.     short    my;
  22.     short    mb;
  23.     short    mcoord;
  24.     short    lcoord = -1;
  25.     short    min_coord;
  26.     short    first_time;
  27.     short    max_coord;
  28.     GRECT    sliderect;
  29.     GRECT    boundrect;
  30.  
  31.     obj_offxywh(ptree, obj, &sliderect);
  32.     obj_offxywh(ptree, obj_parent(ptree, obj), &boundrect);
  33.  
  34.     if (vertical) {
  35.         min_coord = boundrect.g_y + (sliderect.g_h / 2);
  36.         max_coord = min_coord + boundrect.g_h - sliderect.g_h;
  37.     } else {
  38.         min_coord = boundrect.g_x + (sliderect.g_w / 2);
  39.         max_coord = min_coord + boundrect.g_w - sliderect.g_w;
  40.     }
  41.  
  42.     if (max_coord == min_coord) {
  43.         return 0;    /* naughty caller!                                              */
  44.     }
  45.  
  46.     first_time = 1000;
  47.     do    {
  48.         graf_mkstate(&mx, &my, &mb, &dmy);
  49.         mcoord = (vertical) ? my : mx;
  50.         if (mcoord < min_coord) {
  51.             mcoord = min_coord;
  52.         } else if (mcoord > max_coord) {
  53.             mcoord = max_coord;
  54.         }
  55.         slidepos = (short)(((mcoord - min_coord) * 1000L) / (max_coord - min_coord));
  56.         if (slidepos < 1) {
  57.             slidepos = 1;
  58.         }
  59.         if (lcoord != mcoord) {
  60.             lcoord = mcoord;
  61.             if (vertical) {
  62.                 ptree[obj].ob_y = mcoord - min_coord;
  63.             } else {
  64.                 ptree[obj].ob_x = mcoord - min_coord;
  65.             }
  66.             (*ufunc)(ptree, obj, slidepos+first_time, udata);
  67.             first_time = 0;
  68.         }
  69.     } while (mb);
  70.  
  71.     (*ufunc)(ptree, obj, slidepos+2000, udata);
  72.  
  73.     return slidepos;
  74.  
  75. }
  76.  
  77.  
  78.  
  79.